package com.example.ibsp_demo.service.location;

import com.alibaba.fastjson2.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

@Service
public class LocationServiceImpl implements ILocationService {

    @Value("${baidu.map.api.key}")
    private String apiKey;

    @Value("${baidu.map.api.geocoding-url}")
    private String geocodingUrl;

    private final RestTemplate restTemplate = new RestTemplate();

    // 实现根据IP获取城市（百度地图API需要先获取经纬度，再解析城市）
    @Override
    public String getCityByIp(String ip) {
        // 注意：百度地图API不直接支持通过IP获取城市，这里简化处理
        // 实际项目中建议使用独立的IP定位服务，或结合前端定位
        return "南昌市"; // 示例返回，实际需要实现IP到经纬度的转换
    }

    // 实现根据经纬度获取城市
    @Override
    public String getCityByCoordinates(double longitude, double latitude) {
        try {
            // 构建请求参数
            Map<String, Object> params = new HashMap<>();
            params.put("ak", apiKey);
            params.put("output", "json");
            params.put("coordtype", "wgs84ll"); // 坐标类型，根据实际情况调整
            params.put("location", latitude + "," + longitude); // 注意参数顺序是纬度在前，经度在后

            // 发送请求
            ResponseEntity<String> response = restTemplate.getForEntity(
                    geocodingUrl + "?ak={ak}&output={output}&coordtype={coordtype}&location={location}",
                    String.class,
                    params
            );

            // 解析响应
            if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
                JSONObject result = JSONObject.parseObject(response.getBody());
                if (result.getIntValue("status") == 0) {
                    JSONObject addressComponent = result.getJSONObject("result")
                            .getJSONObject("addressComponent");
                    return addressComponent.getString("city");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}